package com.lxf.canal.api.demo;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lxf.canal.api.base.BaseDataConstant;
import com.lxf.canal.api.base.model.ApiRequestVO;
import com.lxf.canal.api.base.model.ApiResponseVO;
import com.lxf.canal.api.utils.HttpUtil;
import com.lxf.canal.api.utils.RSAUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.DateUtils;
import org.junit.Test;

import java.util.Date;
import java.util.UUID;
/**
 * @description: 渠道数据同步api相关接口对接示例
 * @author: xql
 * @date: 2025/11/11 17:58
 */
public class CanalApiMain {
    /**
     * 1-商户同步demo
     */
    @Test
    public void syncCompany() {
        ApiRequestVO request = new ApiRequestVO();
        request.setReqId( this.generateUUID() );
        request.setAppId(BaseDataConstant.APP_ID);
        // 构建商户数据
        JSONObject companyData = new JSONObject();
        // 设置公司相关信息
        companyData.put("taxationNo", BaseDataConstant.TAXATION_NO);              // 平台业务公司号
        companyData.put("outMemberNo", this.generateUUID());             // 外部商户号（客户自身的唯一编号）
        companyData.put("enterpriseName", "测试同步企业02");             // 企业名称（营业执照真实名称）
        companyData.put("contacts", "何康");                                // 联系人姓名
        companyData.put("contactsPhone", "15609652684");                   // 联系人手机号
        companyData.put("companyAccount", "cshkapi02");                       // 企业账号（用于登录，5-25字符，不含特殊字符，系统唯一）
        companyData.put("orgImg", "https://flieupload.oss-cn-hangzhou.aliyuncs.com/account/businessLicense/5ab024f957254f79ad44e0cff015c816.jpg"); // 企业营业执照图片的URL地址
        companyData.put("organizationCode", "91510600MA6B00XP2F");         // 社会统一信用代码
        companyData.put("legal", "何康");                                   // 法人姓名
        companyData.put("legalIdentificationNumber", "340823199810154034"); // 法人身份证号
        companyData.put("legalBackCertificates", "https://zx-webfile.lingxinpay.com/marketing/Incoming/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250915134437_56_395_lxf_1757915521220.jpg"); // 法人身份证国徽面
        companyData.put("legalFrontCertificates", "https://zx-webfile.lingxinpay.com/marketing/Incoming/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250915134438_57_395_lxf_1757915586577.jpg "); // 法人身份证人像面
        companyData.put("legalPhone", "15609652684");                      // 法人手机号
        companyData.put("email", "hekang@bpotop.com");                     // 邮箱
        companyData.put("address", "湖北省黄石市黄石港区迎宾大道19号黄石物流中心内6号楼2-215室");                     // 商户地址
        companyData.put("businessScope", "技术推广服务;软件开发、数据处理;企业征信服务;"); // 经营范围
        companyData.put("companyAccountPhone", "15609652684");             // 绑定手机号（用于操作企业端时接收短信验证码）
        // 使用平台公钥加密数据
        String encryptDataStr;
        try {
            encryptDataStr = RSAUtil.encryptPub(companyData.toJSONString(), BaseDataConstant.PLATFORM_PUBLIC_KEY);
        } catch (Exception e) {
            throw new RuntimeException("加密请求数据失败", e);
        }
        request.setData(encryptDataStr);

        // 发送请求
        String requestParam = JSON.toJSONString(request);
        System.out.println("商户同步请求参数requestParam: " + requestParam);

        String responseParam = HttpUtil.doPost(BaseDataConstant.LXF_COMPANY_API_URL, requestParam);
        System.out.println("商户同步响应参数responseParam: " + responseParam);

        // 解析响应
        ApiResponseVO apiResponseVO = JSON.parseObject(responseParam, ApiResponseVO.class);
        if (StringUtils.equals("100", apiResponseVO.getCode())) {
            try {
                String decryptData = RSAUtil.decryptPri(apiResponseVO.getData(), BaseDataConstant.COMPANY_PRIVATE_KEY);
                System.out.println("data数据解密后decryptData: " + decryptData);
            } catch (Exception e) {
                throw new RuntimeException("解密响应数据失败", e);
            }
        } else {
            System.out.println("请求失败: " + apiResponseVO.getMessage());
        }
    }
    /**
     * 2-任务同步demo
     */
    @Test
    public void syncTask() {
        // 初始化请求对象
        ApiRequestVO request = new ApiRequestVO();
        request.setReqId( this.generateUUID() );
        request.setAppId(BaseDataConstant.APP_ID);

        // 构建任务数据
        JSONObject taskData = new JSONObject();
        //业务公司编号（必填）
        taskData.put("taxationNo", BaseDataConstant.TAXATION_NO);
        // 任务标题（必填）
        taskData.put("taskTitle", "商品分拣任务");
        // 外部任务编号（必填）（唯一）
        taskData.put("outTaskNo", this.generateUUID() );
        // 平台商户号（必填）由 1-商户同步 syncCompany 接口获取
        taskData.put("memberNo", "1993968983002488832");
        // 结算单位( 1:分/单  2:分/日 3:分/月  4:面议)（非必填）
        taskData.put("settlementUnit", "");
        // 最小结算价格，单位：分 （结算单位=4，不需要传该字段；其它值时必传（非必填）
        taskData.put("minSettlementPriceDeci", "");
        // 最大结算价格，单位：分（结算单位=4，不需要传该字段；其它值时必传）（非必填）
        taskData.put("settlementPriceDeci", "");
        // 任务开始时间（格式：yyyy-MM-dd）（必填）
        taskData.put("taskStartDate", "2025-11-14");
        // 任务结束时间（格式：yyyy-MM-dd）（非必填）
        taskData.put("taskEndDate", "");
        // 任务地址（非必填）
        taskData.put("area", "北京");
        // 验收标准（非必填）
        taskData.put("acceptanceCriteria", "完成每日分拣量且无错分，需按时打卡上下班");
        // 任务描述（必填）
        taskData.put("taskContent", "负责仓库内商品分拣、搬运等工作");
        // 项目背景（必填）
        taskData.put("projectBackground", "由于双十一大促期间订单量激增，需增加临时人力完成物流任务");
        // 使用平台公钥加密数据
        String encryptDataStr;
        try {
            encryptDataStr = RSAUtil.encryptPub(taskData.toJSONString(), BaseDataConstant.PLATFORM_PUBLIC_KEY);
        } catch (Exception e) {
            throw new RuntimeException("加密请求数据失败", e);
        }
        request.setData(encryptDataStr);

        // 发送请求
        String requestParam = JSON.toJSONString(request);
        System.out.println("请求参数requestParam: " + requestParam);

        String responseParam = HttpUtil.doPost(BaseDataConstant.LXF_TASK_API_URL, requestParam);
        System.out.println("响应参数responseParam: " + responseParam);

        // 解析响应
        ApiResponseVO apiResponseVO = JSON.parseObject(responseParam, ApiResponseVO.class);
        if (StringUtils.equals("100", apiResponseVO.getCode())) {
            try {
                String decryptData = RSAUtil.decryptPri(apiResponseVO.getData(), BaseDataConstant.COMPANY_PRIVATE_KEY);
                System.out.println("data数据解密后decryptData: " + decryptData);
            } catch (Exception e) {
                throw new RuntimeException("解密响应数据失败", e);
            }
        } else {
            System.out.println("请求失败: " + apiResponseVO.getMessage());
        }
    }
    /**
     * 3-订单同步demo
     */
    @Test
    public void syncOrder() {
        // 初始化请求对象
        ApiRequestVO request = new ApiRequestVO();
        request.setReqId( this.generateUUID() );
        request.setAppId(BaseDataConstant.APP_ID);

        // 构建订单数据
        JSONObject orderData = new JSONObject();
        // 任务编号 (必填) 由 2-任务同步 syncTask 接口获取
        orderData.put("taskNo", "1993969316812410880");
        // 订单编号 (必填)
        orderData.put("outerOrderNo", this.generateUUID() );
        // 平台商户编号 (必填)由 1-商户同步 syncCompany 接口获取
        orderData.put("memberNo", "1993968983002488832");
        // 业务公司编号 (必填)
        orderData.put("taxationNo", BaseDataConstant.TAXATION_NO);
        // 人员姓名 (必填)
        orderData.put("payeeName", "何康");
        // 手机号 (必填)
        orderData.put("payeeMobile", "15609652684");
        // 身份证号码 (必填)
        orderData.put("payeeCertificateNo", "340823199810154034");
        // 合同url (必填)
        orderData.put("contractUrl", "https://example.com/contract/12345.pdf");
        // 合同id (非必填)
        orderData.put("contractId", "ONT202311050001");
        // 最佳人脸照片url (条件必填)
        orderData.put("bestFaceUrl", "https://example.com/face/12345.jpg");
        // 订单类型 (必填) 0：转账，4：退票
        orderData.put("orderType", "0");
        // 回单url (非必填)（可以在后续调用回单同步接口的时候传入
        orderData.put("receiptsUrl", "https://example.com/receipt/12345.pdf");
        // 支付类型 (必填) 1：银行卡，2：支付宝，4：微信
        orderData.put("payType", "1");
        // 账户号 (必填)
        orderData.put("payeeAccount", "6222021234567890123");
        // 应发金额 (必填)
        orderData.put("predictAmount", 10000.00);
        // 税前金额 (必填)
        orderData.put("operatingIncome", 10000.00);
        // 实发金额 (必填)
        orderData.put("actualAmount", 9910.00);
        // 汇总服务费 (非必填)
        orderData.put("serviceFee", 500.00);
        // 预扣个税适用率 (非必填)
        orderData.put("taxableIncomeChargeRate", 0.03);
        // 个人承担连续劳务个税 (非必填)
        orderData.put("taxableIncomeCharge", 90.00);
        // 个税计算公式 (非必填)
        orderData.put("taxableIncomeChargeString", "");
        // 增值税总费用 (非必填)
        orderData.put("valueAddedTaxChannel", 200.00);
        // 增值附加税率 (非必填)
        orderData.put("valueAddedTaxChannelRate", 0.02);
        // 增值税承担主体 (非必填) 0：企业承担，1：个人承担
        orderData.put("valueAddedTaxChannelSubject", "0");
        // 交易完成时间 (必填)
        orderData.put("tradeEndTime", DateUtils.formatDate(new Date(), "yyyy-MM-dd HH:mm:ss"));
        // 请求通道 (必填)
        orderData.put("chan", "招商银行");
        // 备注 (非必填)
        orderData.put("remark", "测试订单备注");

        // 使用平台公钥加密数据
        String encryptDataStr;
        try {
            encryptDataStr = RSAUtil.encryptPub(orderData.toJSONString(), BaseDataConstant.PLATFORM_PUBLIC_KEY);
        } catch (Exception e) {
            throw new RuntimeException("加密请求数据失败", e);
        }
        request.setData(encryptDataStr);

        // 发送请求
        String requestParam = JSON.toJSONString(request);
        System.out.println("请求参数requestParam: " + requestParam);

        String responseParam = HttpUtil.doPost(BaseDataConstant.LXF_CANAL_ORDER_SYNC_URL , requestParam);
        System.out.println("响应参数responseParam: " + responseParam);

        // 解析响应
        ApiResponseVO apiResponseVO = JSON.parseObject(responseParam, ApiResponseVO.class);
        if (StringUtils.equals("100", apiResponseVO.getCode())) {
            try {
                String decryptData = RSAUtil.decryptPri(apiResponseVO.getData(), BaseDataConstant.COMPANY_PRIVATE_KEY);
                System.out.println("data数据解密后decryptData: " + decryptData);
            } catch (Exception e) {
                throw new RuntimeException("解密响应数据失败", e);
            }
        } else {
            System.out.println("请求失败: " + apiResponseVO.getMessage());
        }
    }

    /**
     * 4-订单信息变更demo
     */
    @Test
    public void orderInformationChange() {
        // 初始化请求对象
        ApiRequestVO request = new ApiRequestVO();
        request.setReqId( this.generateUUID() );
        request.setAppId(BaseDataConstant.APP_ID);

        // 构建业务数据
        JSONObject data = new JSONObject();
        // 订单编号 (必填)
        data.put("outerOrderNo", "b31ccf70356e4d7386ad8a6919b8a849");
        // 业务公司编号 (必填)
        data.put("taxationNo", BaseDataConstant.TAXATION_NO);
        // 订单类型 (必填) （4：订单退票，5：订单回单）
        data.put("orderType", "5");
        // 回单url (订单类型  5：订单回单 时 必填)
        data.put("receiptsUrl", "https://flieupload.oss-cn-hangzhou.aliyuncs.com/servicerfile/receiptFile/1874727460524531712%E4%BA%A4%E6%98%93%E5%9B%9E%E5%8D%95.pdf");

        // 使用平台公钥加密业务数据
        String encryptDataStr;
        try {
            encryptDataStr = RSAUtil.encryptPub(data.toJSONString(), BaseDataConstant.PLATFORM_PUBLIC_KEY);
            request.setData(encryptDataStr);
        } catch (Exception e) {
            throw new RuntimeException("加密请求数据失败", e);
        }

        // 发送请求
        String requestParam = JSON.toJSONString(request);
        System.out.println("请求参数requestParam:" + requestParam);

        String responseParam = HttpUtil.doPost(BaseDataConstant.LXF_ORDER_INFORMATION_CHANGE_URL, requestParam);
        System.out.println("响应参数responseParam:" + responseParam);

        // 解析响应
        ApiResponseVO apiResponseVO = JSON.parseObject(responseParam, ApiResponseVO.class);
        if (null != apiResponseVO && StringUtils.equals("100", apiResponseVO.getCode()) ) {
            try {
                if(StringUtils.isNotBlank(apiResponseVO.getData())){
                    String decryptData = RSAUtil.decryptPri(apiResponseVO.getData(), BaseDataConstant.COMPANY_PRIVATE_KEY);
                    System.out.println("data数据解密后decryptData:\n" + decryptData);
                }
            } catch (Exception e) {
                throw new RuntimeException("解密响应数据失败", e);
            }
        } else {
            System.out.println("请求失败: " + apiResponseVO.getMessage());
        }
    }
    /**
     * @description: 生成UUID
     * @author: xql
     * @date: 2025/11/27 16:59
     */
    public static String generateUUID( ){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
}
